package com.example.myapplication.application;

import android.app.Application;
import android.content.res.Configuration;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.room.Room;

import com.example.myapplication.storage.database.RoomUsageDatabase;

import lombok.Getter;

/**
 * 自定义的Application。
 * 需要在AndroidManifest.xml中设置如下内容：<pre><code>
 *  &lt;application
 *         android:name=".application.CustomApplication"
 *  </code></pre>
 */
public class CustomApplication extends Application {

//    @Getter
    private static CustomApplication instance;

    public static CustomApplication getInstance() {
        return instance;
    }

    /**
     * 声明room数据库对象
     */
    private RoomUsageDatabase roomUsageDatabase;

    /**
     * App启动时执行。一个App从启动到终止期间只会执行一次，该方法会在任何Activity的onCreate之前执行。
     */
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("CustomApplication", "执行CustomApplication.onCreate()");

        // 初始化Room数据库对象实例
        roomUsageDatabase = Room.databaseBuilder(this, RoomUsageDatabase.class, "room-usage")
                // 允许迁移数据库（当发生数据库变更时，Room默认删除原数据库再创建新数据库，这样原来的数据就会丢失。设置为允许迁移数据库可以保留原来的数据
                .addMigrations()
                // 设置允许数据库操作在主线程中执行（主线程是UI交互线程，一般耗时的操作不放在主线程中，会影响UI交互的响应速度）。Room默认不能在主线程中操作
                .allowMainThreadQueries()
                .build();

        instance = this;
    }

    /**
     * App终止时执行。注意该方法在真实发布的App内是永远不会被执行的。
     */
    @Override
    public void onTerminate() {
        super.onTerminate();
        Log.d("CustomApplication", "执行CustomApplication.onTerminate()");
    }

    /**
     * 在App的配置改变时执行。比如：手机从横屏变成竖屏时。
     * @param newConfig The new device configuration.
     */
    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // 获取变更前的配置
        Configuration oldConfig = getResources().getConfiguration();
        String oldOrientation = oldConfig.orientation == Configuration.ORIENTATION_PORTRAIT ? "竖屏" : "横屏";
        String newOrientation = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT ? "竖屏" : "横屏";

        Log.d("CustomApplication",
                String.format("执行CustomApplication.onConfigurationChanged()。屏幕方向从[%s]变为[%s]", oldOrientation, newOrientation));
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
    }

    public RoomUsageDatabase getRoomUsageDatabase() {
        return roomUsageDatabase;
    }
}
